package com.hsh.tools.convert;

import com.hsh.vo.result.convert.DeptVO;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 该类用于递归构建树形菜单
 * https://blog.csdn.net/qq_42216791/article/details/107423990
 */
public class DeptTreeBuilder {

    // 构建某一字节的Tree菜单树
    public static List<DeptVO> buildChild(List<DeptVO> nodes, String deptId) {
        // 当前选择节点的树
        List<DeptVO> userDeptVOS = new ArrayList<>();
        for (DeptVO nav : nodes) {
            if (nav.getDeptId().equals(deptId)) {
                userDeptVOS.add(nav);
            }
        }
        // 为根菜单设置子菜单，getChild是递归调用的
        for (DeptVO nav : userDeptVOS) {
            // 获取根节点下的所有子节点 使用getChild方法
            List<DeptVO> childList = getChild(deptId, nodes);
            // 给根节点设置子节点
            nav.setChildren(childList);
        }
        return userDeptVOS;
    }

    //*******************************如上获取子节点的子节点************************************************

    public static List<DeptVO> ListToTree(List<DeptVO> nodes) {
        // 根节点
        List<DeptVO> rootDept = new ArrayList<>();
        for (DeptVO nav : nodes) {
            // 表示只有为父节点才构建Tree树
            if (nav.getParentId().equals("0")) {
                rootDept.add(nav);
            }
        }
        // 为根菜单设置子菜单，getChild是递归调用的
        for (DeptVO item : rootDept) {
            // 获取根节点下的所有子节点 使用getChild方法
            List<DeptVO> childList = getChild(item.getDeptId(), nodes);
            item.setChildren(childList);
        }
        return rootDept;
    }

    // 获取子节点
    private static List<DeptVO> getChild(String deptId, List<DeptVO> nodes) {
        //  子菜单
        List<DeptVO> childList = new ArrayList<>();
        for (DeptVO nav : nodes) {
            // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            // 相等说明：为该根节点的子节点。
            if (nav.getParentId().equals(deptId)) {
                childList.add(nav);
            }
        }
        // 递归
        for (DeptVO nav : childList) {
            nav.setChildren(getChild(nav.getDeptId(), nodes));
        }
        // 如果节点下没有子节点，返回一个空List（递归退出）
        if (childList.size() == 0) {
            return Collections.emptyList();
        }
        return childList;
    }

    /**
     * treeToList
     */
    public static List<DeptVO> treeToList(List<DeptVO> menuVOList) {
        List<DeptVO> result = new ArrayList<>();
        for (DeptVO vo : menuVOList) {
            result.add(vo);
            List<DeptVO> childMsg = vo.getChildren();
            if (childMsg != null && childMsg.size() > 0) {
                List<DeptVO> entityList = treeToList(childMsg);
                result.addAll(entityList);
            }
        }
        if (result.size() > 0) {
            for (DeptVO entity : result) {
                entity.setChildren(Collections.emptyList());
            }
        }
        return result;
    }
}
